/* MODULO: BLOCK_ENCRYPTER
*  =======================
*  Guarda toda la informacion necesaria para aplicar encriptacion por bloques
*  a archivos BMP.
*  Se usa en el main de la aplicacion, en el archivo encrypter.c
*/
#ifndef BLOCK_ENCRYPTER_H__
#define BLOCK_ENCRYPTER_H__

#include <openssl/evp.h>
#include "imageADT.h"


/* Tipo de Dato : operationT 
*  =========================
*  Estructa que almacena los datos necesarios para definir la operacion a
*  realizar
*/
typedef struct operation{
	int type; //Encriptar o desencriptar
	char *password;	
	char iv[EVP_MAX_IV_LENGTH + 1];
	char key[EVP_MAX_KEY_LENGTH + 1];
	int algorithm; //AES o DES
	int mode; //ECB, CFB, OFB, CBC
}*operationT;



/* Estructura: blockEncrypterT 
*  ===========================*
*  Esta es la estructura principal de la aplicacion. Guarda handles a la fuente
*  de datos y su destino.
*  Tambien mantiene los datos para el tipo de operacion que se realizara
*  Ademas guarda la informacion de la imagen cuando se carga de disco
*/
typedef struct blockEncrypter{
	FILE *input;
	FILE *output;
	char * outputFilename; /* Para borrar el archivo en caso de error*/
	operationT operation;
	imageADT image; /* Informacion de la imagen */
}*blockEncrypterT;



/* FUNCIONES PUBLICAS 
*  ==================
*/

/* Inicializa una estructura blockEncrypterT
 * En base a la linea de comandos realiza lo siguiente:
 * 		Identifica los archivos origen y  destino, y los abre.
 * 		Carga la imagen en memoria y guarda el tipo de encriptacion
 * 		que se usara
 * Retorna NULL en caso de errores
*/
blockEncrypterT InitializeBlockEncrypter( int cant, char *args[] );


/* Realiza la operacion parseada y guardada en processor
 * Devuelve 0 si la operacion fue exitosa.
 * Devuleve distinto de 0 en caso de algun error.		
*/
int RunBlockEncrypter( blockEncrypterT processor );


/* Libera los recursos en la estructura blockEncrypterT */
void TerminateBlockEncrypter( blockEncrypterT *processor );

/* Para debug */
void ShowOperationData( blockEncrypterT b );

#endif
